﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "GbmpQuickCast.h"
#include "IElement.h"


namespace gcmp
{
    class IDocument;
    class ILinkDocumentElement;
    class IModelView;
    class IGdcLinkModelView;


    /// \brief 链接视图设置类型
    enum class LinkViewConfigType : int32_t
    {
        AccordingToHostView = 0,                ///< 按主体视图
        AccordingToLinkView = 1                 ///< 按链接视图
    };

    /// \brief 重设链接视图的原因
    enum class ChangeGdcLinkViewReason : int32_t
    {
        Others = 0,       ///< 其他原因，枚举中不包含的可选该选项
        ViewScaleChanged = 1   ///< 因视图比例变化
    };

    // \brief 主文档中对链接文档中的ModelView代理对象
    // 
    // 与链接文档中的ModelView一一对应
    class GCMP_MODEL_INTERFACE_EXPORT ILinkModelViewProxy: public IElement
    {
        DEFINE_CAST_DERIVED(gcmp::ILinkModelViewProxy, gcmp::IElement);

    public:
        virtual ~ILinkModelViewProxy() = default;

        /// \brief 创建链接视图代理对象
        ///
        /// \param pHostDocument 链接模型对象所属文档
        /// \param linkDocumentElementId 链接模型对象Id
        /// \param linkModelViewId 需要链接的链接视图Id
        /// \param hostModelViewId 需要链接的主体视图Id
        /// \param useModelViewData 该值为true时，表示使用视图数据进行链接视图(如跨专业链接视图)
        /// \param extraData 表示使用的链接视图(如跨专业链接视图)的补充数据
        /// \param linkDocumentTypeId 跨专业嵌套链接视图所属的链接文档类型id（useModelViewData为true时有效）
        /// \return ILinkModelViewProxy* 创建好的链接视图代理对象
        static ILinkModelViewProxy* Create(IDocument* pHostDocument, const ElementId& linkDocumentElementId, const ElementId& linkModelViewId, ElementId hostModelViewId, bool useModelViewData = false,
            const std::map<std::wstring, std::wstring>& extraData = std::map<std::wstring, std::wstring>(), const ElementId& linkDocumentTypeId = ElementId::InvalidID);

    public:
        /// \brief 获取关联的链接文档对象
        /// \return 关联的Element指针
        virtual const ILinkDocumentElement* GetLinkDocumentElement() const = 0;

        /// \brief 获取关联的主体视图对象Id
        /// \return 关联的主体视图对象Id
        virtual ElementId GetHostModelViewId() const = 0;

        /// \brief 设置主文档中与之对应的视图对象的Id
        /// \param hostModelViewId 对应的主视图对象的Id
        virtual bool SetHostModelViewId(const ElementId& hostModelViewId) = 0;

        /// \brief 获取链接文档中与之对应的视图对象的Id
        /// \return 对应的视图对象的Id
        virtual ElementId GetLinkModelViewId() const = 0;

        /// \brief 设置链接文档中与之对应的视图对象的Id
        /// \param linkModelViewId 对应的链接视图对象的Id
        virtual bool SetLinkModelViewId(const ElementId& linkModelViewId) = 0;

        /// \brief 获取链接文档中与之对应的视图对象
        /// \return 对应的视图对象
        virtual const IModelView* GetLinkModelView() const = 0;

        /// \brief 获取跨专业链接文档中与之对应的视图对象
        /// \return 对应的视图对象
        virtual const IGdcLinkModelView* GetGdcLinkModelView() const = 0;

        /// \brief 设置跨专业链接文档中与之对应的视图对象
        /// \param pGdcLinkModelView 对应的链接视图对象
        /// \param reason 重设链接视图对象的原因
        virtual bool SetGdcLinkModelView(const IGdcLinkModelView* pGdcLinkModelView, ChangeGdcLinkViewReason reason) = 0;

        /// \brief 获取跨专业链接文档中与之对应的视图对象中的补充数据
        /// \return 对应的补充数据
        virtual const std::map<std::wstring, std::wstring>& GetGdcLinkModelViewExtraData() const = 0;
    public:

        /// \brief 获取链接视图范围类型
        /// \return 对应的链接范围类型
        virtual LinkViewConfigType GetLinkViewRangeType() const = 0;

        /// \brief 设置链接视图范围类型
        /// \param type 对应的链接视图范围类型
        virtual void SetLinkViewRangeType(LinkViewConfigType type) = 0;

        /// \brief 获取链接视图样式类型
        /// \return 对应的链接视图样式类型
        virtual LinkViewConfigType GetLinkViewGraphicsStyleType() const = 0;

        /// \brief 设置链接视图样式类型
        /// \param type 对应的链接视图样式类型
        virtual void SetLinkViewGraphicsStyleType(LinkViewConfigType type) = 0;

        /// \brief 获取链接视图详细程度类型
        /// \return 对应的链接视图详细程度类型
        virtual LinkViewConfigType GetLinkViewDetailLevelType() const = 0;

        /// \brief 设置链接视图详细程度类型
        /// \param type 对应的链接视图详细程度类型
        virtual void SetLinkViewDetailLevelType(LinkViewConfigType type) = 0;

        /// \brief 获取当前链接视图是否通过视图数据进行链接
        ///        通过ILinkModelViewProxy::Create中的useModelViewData参数进行设置，用于表示链接视图代理对象的数据来源
        ///        如跨专业链接时，链接视图的数据来源为打包出来的ModelView数据；而同专业链接视图时，数据来源为内存中的ModelView对象
        ///
        /// \return bool 为true时，表示使用视图数据进行链接视图(如跨文档链接视图)；为false时，表示通过ModelView进行链接视图
        virtual bool IsUseGdcLinkModelViewData() const = 0;

    public:
        /// \brief 获取Implementation Uid
        ///
        /// \return UniIdentity 返回ImplementationUid
        static UniIdentity GetImplementationUid();
    };
}
